﻿using SupportLayer.Constantes.OUTROS;
using SupportLayer.Constantes.PRODUTO;
using SupportLayer.Enums;
using SupportLayer.Objetos.Produto;
using Util.ExtensionMethods;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using PersistenceLayer.DAL;
using PersistenceLayer.Model;
using SupportLayer.Constantes;
using SupportLayer;

namespace ByBikeShop.Site.Pages
{
	public partial class Produtos : BasePage
	{
		Administracao.UCs.Mensagem.mensagens ucMensagem;

		private int GetPagina
		{
			get
			{
				if (Request.QueryString[OUTROS.PAGINA] == null)
					return 1;

				int page = 0;

				Int32.TryParse(Util.Criptografia.Decriptar(SupportLayer.Constantes.CRIPTO.CHAVE, SupportLayer.Constantes.CRIPTO.VETOR, Request.QueryString[OUTROS.PAGINA].ToString()), out page);

				if (page > 0)
					return page;

				return 1;
			}
		}
		private string GetFilter
		{
			get
			{
				if (Request.QueryString[OUTROS.FILTRO] == null)
					return "";
				return Util.Criptografia.Decriptar(SupportLayer.Constantes.CRIPTO.CHAVE, SupportLayer.Constantes.CRIPTO.VETOR, Request.QueryString[OUTROS.FILTRO].ToString());
			}
		}
		private Ordenacao GetOrdenacao
		{
			get
			{
				try
				{
					if (Request.QueryString[OUTROS.ORDENACAO] == null)
						return Ordenacao.Newest;

					return (Ordenacao)(Convert.ToInt32(Util.Criptografia.Decriptar(SupportLayer.Constantes.CRIPTO.CHAVE, SupportLayer.Constantes.CRIPTO.VETOR, Request.QueryString[OUTROS.ORDENACAO].ToString())));
				}
				catch (Exception)
				{
					return Ordenacao.Newest;
				}
			}
		}
		private int GetNumeroPaginas
		{
			get
			{
				if ((hdfNumeroPaginas.Value == null) || (Convert.ToInt32(hdfNumeroPaginas.Value) <= 0))
					return 0;

				return Convert.ToInt32(hdfNumeroPaginas.Value);
			}
		}

		protected void Page_Load(object sender, EventArgs e)
		{
			try
			{
				base.PageLoad();
			}
			catch (Exception)
			{

				throw;
			}
		}
		public override void CarregaDados()
		{
			try
			{
				if (IsPostBack)
					return;

				// Carregando a lista de ordenações possíveis
				ddlOrdenarProdutos.Items.Add(new ListItem() { Value = Ordenacao.Newest.ToString(), Text = "Mais novos" });
				ddlOrdenarProdutos.Items.Add(new ListItem() { Value = Ordenacao.Name.ToString(), Text = "Nome" });
				ddlOrdenarProdutos.Items.Add(new ListItem() { Value = Ordenacao.Cheaper.ToString(), Text = "Menor Preço" });
				ddlOrdenarProdutos.Items.Add(new ListItem() { Value = Ordenacao.Expensive.ToString(), Text = "Maior Preço" });
				ddlOrdenarProdutos.Items.FindByValue(GetOrdenacao.ToString()).Selected = true;

				// Carregando as primeiras 20 marcas
				DataTable dt = new DataTable();
				dt.Columns.Add(MARCA.ID);
				dt.Columns.Add(MARCA.DESCRICAO);
				foreach (Produto_Marca m in new Produto_MarcaDAL().Listar(20))
					dt.Rows.Add("/Site/Pages/Produtos.aspx?" + OUTROS.PAGINA.ToString() + "=" +
						Util.Criptografia.Encriptar(SupportLayer.Constantes.CRIPTO.CHAVE, SupportLayer.Constantes.CRIPTO.VETOR, "1") +
					"&" + OUTROS.FILTRO + "=" + Util.Criptografia.Encriptar(SupportLayer.Constantes.CRIPTO.CHAVE, SupportLayer.Constantes.CRIPTO.VETOR, m.Descricao)
					+ "&" + OUTROS.ORDENACAO + "=" + Util.Criptografia.Encriptar(SupportLayer.Constantes.CRIPTO.CHAVE, SupportLayer.Constantes.CRIPTO.VETOR, Ordenacao.Newest.ToString()), m.Descricao);
				rptMarcas.DataSource = dt;
				rptMarcas.DataBind();

				CarregaProdutos();
			}
			catch (Exception)
			{
				throw;
			}
		}
		private void CarregaProdutos()
		{
			try
			{
				ProdutoDAL pd = new ProdutoDAL();
				List<PersistenceLayer.Model.Produto> lp = new List<PersistenceLayer.Model.Produto>();
				int numProdutos = 0;
				lp.AddRange(pd.Listar((GetPagina - 1) * 16, 16, (int)GetOrdenacao, GetFilter, false, out numProdutos));
					//BusinessProduto.GetProdutos((GetPagina - 1) * 16, 16, GetOrdenacao, GetFilter, out numProdutos));
				if (numProdutos == 0)
					if ((GetFilter == OUTROS.BIKES_COMPLETAS) ||
							(GetFilter == OUTROS.ACESSORIOS_BIKES) ||
							(GetFilter == OUTROS.ACESSORIOS_CICLISTA) ||
							(GetFilter == OUTROS.PARTES_BIKES))
						switch (GetFilter)
						{
							case OUTROS.BIKES_COMPLETAS:
								lp.AddRange(pd.ListarPorMaster((GetPagina - 1) * 16, 16, (int)GetOrdenacao, "Bikes Completas", out numProdutos));
								break;
							case OUTROS.ACESSORIOS_CICLISTA:
								lp.AddRange(pd.ListarPorMaster((GetPagina - 1) * 16, 16, (int)GetOrdenacao, "Acessórios de Ciclista", out numProdutos));
								break;
							case OUTROS.ACESSORIOS_BIKES:
								lp.AddRange(pd.ListarPorMaster((GetPagina - 1) * 16, 16, (int)GetOrdenacao, "Acessórios de Bikes", out numProdutos));
								break;
							case OUTROS.PARTES_BIKES:
								lp.AddRange(pd.ListarPorMaster((GetPagina - 1) * 16, 16, (int)GetOrdenacao, "Peças Diversas", out numProdutos));
								break;
							default:
								break;
						}
				if (numProdutos == 0)
					lp.AddRange(pd.Listar((GetPagina - 1) * 16, 16, (int)GetOrdenacao,
						BuscaFonetica.VerificaFonetica(GetFilter), false, out numProdutos));

				CarregaPaginacao(numProdutos);

				DataTable dtProdutos = new DataTable();
				dtProdutos.Columns.Add(PRODUTO.ID);
				dtProdutos.Columns.Add(PRODUTO.FOTO);
				dtProdutos.Columns.Add(PROMOCAO.ID);
				dtProdutos.Columns.Add(PRODUTO.MODELO);
				dtProdutos.Columns.Add(PRODUTO.PRECO);

				foreach (PersistenceLayer.Model.Produto p in lp)
				{
					string preco = "";

					bool indisponivel = true;

					if (p.Produto_Especificacao.isNull())
						indisponivel = true;
					else
						foreach (var item in p.Produto_Especificacao)
						{
							if (item.Quantidade > 0)
								indisponivel = false;
						}

					if (indisponivel)
						preco = "INDISPONÍVEL";
					else
						preco = p.Preco.toMoneyString();

					//string url = "/" + Produto.Marca.Descricao.Replace(' ', '_') + "/" + Produto.Modelo.Replace(' ', '_');
					//base.AddURLMap("~" + url, "/Site/Pages/VerProduto.aspx?" + OUTROS.PRODUTO_ID + "=" + Produto.ID);

					string ur = "/Site/Pages/VerProduto.aspx?" + OUTROS.PRODUTO_ID + "=" +
						Util.Criptografia.Encriptar(SupportLayer.Constantes.CRIPTO.CHAVE, SupportLayer.Constantes.CRIPTO.VETOR, p.ID.ToString());

					dtProdutos.Rows.Add(
						ur,
						ResolveUrl("/Imagens" + p.Foto_Principal),
						"style=\"opacity: 0\"",
						p.Produto_Marca.Descricao + " " + p.Modelo,
						preco);
				}

				rptProdutos.DataSource = dtProdutos;
				rptProdutos.DataBind();
			}
			catch (Exception ex)
			{
				ucMensagem = (Administracao.UCs.Mensagem.mensagens)LoadControl(ResolveUrl("/Administracao/UCs/Mensagem/mensagens.ascx"));
				ucMensagem.TipoMensagem = TiposMensagens.Erro;
				ucMensagem.Mensagem = ex.Message;
				placeMensagem.Controls.Add(ucMensagem);
			}
		}
		private void CarregaPaginacao(int numProdutos)
		{
			int numPaginas = Convert.ToInt32(numProdutos / 16);
			if (numProdutos % 16 > 0)
				numPaginas++;

			hdfNumeroPaginas.Value = numPaginas.ToString();

			if (GetPagina == 1)
			{
				btnPrimeira.Enabled = false;
				btnPagAnterior.Visible = false;
				btnVoltar.Enabled = false;
			}

			if (GetPagina == GetNumeroPaginas)
			{
				btnUltima.Enabled = false;
				btnUltima.CssClass = "PaginationDisabled";
				btnProxima.Enabled = false;
				btnProxima.CssClass = "PaginationDisabled";
				btnPagProxima.Visible = false;
			}

			lblPagAtual.Text = GetPagina.ToString();
			btnPagAnterior.Text = (GetPagina - 1).ToString();
			btnPagProxima.Text = (GetPagina + 1).ToString();
			btnUltima.Text = ">> Última (" + numPaginas + ")";

		}

		#region Eventos da Página
		protected void hplBikesCompletas_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(1, OUTROS.BIKES_COMPLETAS);
		}

		protected void hplAcessoriosBikes_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(1, OUTROS.ACESSORIOS_BIKES);
		}

		protected void hplAcessoriosCiclista_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(1, OUTROS.ACESSORIOS_CICLISTA);
		}

		protected void hplPartesBike_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(1, OUTROS.PARTES_BIKES);
		}

		protected void btnPrimeira_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(1, GetFilter, (int)GetOrdenacao);
		}

		protected void btnVoltar_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(GetPagina - 1, GetFilter, (int)GetOrdenacao);
		}

		protected void btnPagAnterior_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(GetPagina - 1, GetFilter, (int)GetOrdenacao);
		}

		protected void btnPagProxima_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(GetPagina + 1, GetFilter, (int)GetOrdenacao);
		}

		protected void btnProxima_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(GetPagina + 1, GetFilter, (int)GetOrdenacao);
		}

		protected void btnUltima_Click(object sender, EventArgs e)
		{
			base.RedirectProdutos(GetNumeroPaginas, GetFilter, (int)GetOrdenacao);
		}
		#endregion

	}
}